<?php
/**
 * Created by PhpStorm.
 * User: Inhere
 * Date: 14-4-11
 * Time: 上午9:56
 */
namespace ulue\web;

use Ulue,
    Debug;
use ulue\core\router\Router;
use ulue\core\router\Uri;
use ulue\core\view\AbstractView;
use ulue\core\view\AbstractWidget;
use ulue\ext\zui\Breadcrumb;
use ulue\libs\helpers;
use ulue\core\utils;

class View extends AbstractView
{

    public function filters()
    {
        return array();
    }

    /**
     * 局部渲染，showPartial() 别名
     * @param string $view
     * @param array $data
     * @return bool|mixed|string
     */
    public function showBlock($view='', array $data=[])
    {
        return $this->showPartial( $view,$data );
    }

    /**
     * 简单的输出内容没有布局，不会解析变量，用于直接展示内容或静态的页面
     * $content 1.要输出的内容
     * $content 2.为文件名时候也可，必须带后缀@example index.html news/index.html
     * @param string $content
     * @param int $type
     * @param array $param
     * @throws \ulue\core\TheSystemException
     * @internal param int $type
     * @return string
     */
    public function showContent($content='', $type=1, $param=array())
    {
        self::$headerTag['title'] = Ulue::$app->get('params.title');

        $params = array_merge(self::$headerTag, (array)$param);

        @extract($params);

        //是文件名
        if ( ($pos=stripos($content,$this->viewSuffix)) !==false ) {
            $viewFile = substr($content,0,$pos);

            if ( $file = $this->getViewFile($viewFile) )
            {
                $content = file_get_contents($file);
            }
        }

        $title = empty($title) ? '': "<title>{$title}</title>";

        $html  = <<<EOF
<!DOCTYPE html><html><head>
<meta charset="{$params['charset']}">
      $title
</head><body>
      $content
</body></html>
EOF;

        return (bool) $type ? $html : $content;
    }

    /**
     * [breadcrumb 面包屑导航 ]
     * @param $name
     * @param array $config
     * [
     *   'title' => '位置：',
     *   'labelText' => [
     *       'module'     => '/',
     *       'controller' => 'default',
     *       'action'     => 'index',
     *   ]
     * ]
     * @return void
     */
    public function breadcrumb(array $config=[])
    {
        $bc = new Breadcrumb;

        if ($config) {
            $bc->data = $config;
        }

        return $bc->execute();
    }

//////////////////////////////////////////// Widget ////////////////////////////////////////////

    public function createWidget($value='')
    {
        # code...
    }

    public function startWidget($widget, array $varData = [])
    {
        # code...
    }

    public function closeWidget()
    {
        # code...
    }

    public function loadWidget($name, array $varData=[])
    {
        $widgetClass   = $this->getWidgetClass( $name );

        Debug::trace('i Parsing the widget part class: '.$widgetClass);

        $config['class'] = $widgetClass;
        $config['attrs'] = $varData;

        /**
         * @var $widget AbstractWidget
         */
        $widget = utils\Invoker::object($config);

        if ( ! ($widget instanceof AbstractWidget) ) {
            throw new \DNotFoundException('widget class ['.$widgetClass.'] 必须继承自 ulue\core\view\AbstractWidget ');
        }

        return $widget->execute();
    }

    /**
     * 查找得到 Widget class文件
     * @param string $name
     * @throws DNotFoundException
     * @return string
     */
    public function getWidgetClass($name)
    {
        if ( strpos($name, '\\') && class_exists($name) ) {
            return $name;
        }

        $moduleName = Ulue::$app->module->name;
        $modulePath = Ulue::$app->module->path;
        $classname  = ucfirst(trim($name));

        $widgetFile =  $modulePath.'\widgets\\'.$classname.'.php';

        if ( file_exists($widgetFile) ) {
            unset($modulePath,$widgetFile,$name);

            return $moduleName.'\widgets\\'.$classname;
        }

        $widgetFile = COMM_PATH.'\widgets\\'.$classname.'.php';

        if ( file_exists($widgetFile) ) {
            unset($modulePath,$widgetFile,$name);

            return  Ulue::$app->getDir('@comm') . '\widgets\\'.$classname;
        }

        throw new \DNotFoundException("没有找到需要的widget文件：$classname ");
    }

//////////////////////////////////////////// Other ////////////////////////////////////////////

    //采用布局时; 渲染 其它公共区块 @example left right head foot
    // (除了主体部分外,主体通过 display() 渲染) renderBlock()
    /**
     * @param string $viewFile 布局文件，默认相对于 @run/layouts/ 文件夹查找
     * @param array $data 释放到当前页面的变量数据
     */
    public function showLayout($viewFile, array $data = [])
    {
        if (!$viewFile) {
            return '';
        }

        $viewFile = trim($viewFile);

        Debug::trace("i解析布局文件",['@param $viewFile'=>$viewFile]);

        /**
         * 在布局文件中调用另一个布局文件时，若需要的文件在同一个目录
         * 可使用 [./] 开头来指明要加载当前目录中的文件
         */
        if ( substr($viewFile, 0, 2) === './') {
            $file = dirname($this->layoutFile) . trim($viewFile, '.') . $this->layoutSuffix;

            if ( !is_file($file)) {
                throw new \DNotFoundException("没有找到需要的layout文件：$file ");
            }
        } else {
            // $instance = Ulue::$app->getView();
            // $file = $instance->getLayoutFile($viewFile);
            $file = $this->getLayoutFile($viewFile);
        }

        Debug::trace("布局文件解析完成。",['@param $viewFile'=>$viewFile]);

        return $this->internalRender($file,$data);
    }

    /**
     * 创建相对路径的url地址
     * @param string $route 'user/login'
     * @param string $params
     * @param string $suffix
     * @param string $mode
     * @return bool|string
     */
    public function url($route, $params='', $suffix='', $mode='')
    {
        return Uri::to($route,$params, false , $suffix, $mode);
    }

    /**
     * 创建绝对路径的url地址
     * @param string $route
     * @param string $params
     * @param string $suffix
     * @param string $mode
     * @return mixed|string
     */
    public function absUrl($route='',$params='', $suffix='', $mode='')
    {
        return Uri::abs($route,$params,true,$suffix,$mode);
    }



} //=== end class ===